/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.petshop.dao;

import br.com.petshop.entidades.ItemVenda;
import br.com.petshop.entidades.Venda;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Sidney
 */
public class VendaDAO extends GenericDAO {

    public VendaDAO() {
    }

    public int addVenda(Venda venda, boolean cascade) throws SQLException {
        venda.setId(getNextId("vendas"));
        String query = "INSERT INTO petshop.vendas (Id,Id_Vendedor,Data_Venda,Total_Vendido)VALUES(?,?,?,?)";
        //soma o total vendido
        float totalDasVendas = 0f;
        for (ItemVenda item : venda.getItens()) {
            totalDasVendas += item.getIdProduto().getPreco() * item.getQtde();
        }
        //cria a venda no banco de dados
        executeCommand(query, venda.getId(), venda.getIdVendedor().getId(), venda.getDtVenda(), totalDasVendas);
        //persiste os itens no banco
        if (cascade) {
            for (ItemVenda item : venda.getItens()) {
                addItemVenda(item);
            }
        }
        return venda.getId();
    }

    public int addItemVenda(ItemVenda itemVendido) throws SQLException {
        itemVendido.setId(getNextId("itens_venda"));
        String query = "INSERT INTO petshop.itens_venda (id,Id_Produto,QTDE,Id_Venda)VALUES(?,?,?,?)";
        executeCommand(query, itemVendido.getId(), itemVendido.getIdProduto().getId(), itemVendido.getQtde(), itemVendido.getIdVenda().getId());
        return itemVendido.getId();
    }

    public void updateVenda(Venda venda, boolean cascade) throws SQLException {
        String query = "UPDATE petshop.vendas SET Id_Vendedor = ?,Total_Vendido = ? WHERE Id = ?";
        float totalDasVendas = 0f;
        for (ItemVenda item : venda.getItens()) {
            totalDasVendas += item.getIdProduto().getPreco() * item.getQtde();
        }
        executeCommand(query, venda.getIdVendedor().getId(), totalDasVendas, venda.getId());
        if (cascade) {
            for (ItemVenda item : venda.getItens()) {
                updateItemVenda(item);
            }
        }

    }

    public void updateItemVenda(ItemVenda itemVendido) throws SQLException {
        String query = "UPDATE petshop.itens_venda SET Id_Produto = ?, QTDE = ?, Id_Venda = ? WHERE Id = ?";
        executeCommand(query, itemVendido.getIdProduto().getId(), itemVendido.getQtde(), itemVendido.getIdVenda().getId(),itemVendido.getId());
    }
    //este metodo tem que remover alem do pedido os itens do mesmo

    public void removerVenda(int idVenda) throws SQLException {
        executeCommand("DELETE FROM petshop.itens_venda WHERE Id = ?", idVenda);
        executeCommand("DELETE FROM petshop.vendas WHERE Id = ?", idVenda);
    }
    //este metodo da a possibilidade do usuario remover apenas o item da venda.

    public void removerItemVenda(int idItemVenda) throws SQLException {
        executeCommand("DELETE FROM petshop.itens_venda WHERE Id = ?", idItemVenda);
    }

    public Venda getVenda(int idVenda) throws SQLException {
        ResultSet rs = executeQuery("SELECT * FROM petshop.vendas WHERE Id = ?", idVenda);
        Venda venda = null;
        if (rs.next()) {
            venda = populateVenda(rs,true);//conferir este codigo
        }
        return venda;
    }

    private Venda populateVenda(ResultSet rs,boolean populateItensVendidos) throws SQLException {
        Venda vendaRetornada = new Venda();
        UsuarioDAO userDAO = new UsuarioDAO();
        vendaRetornada.setId(rs.getInt("Id"));
        vendaRetornada.setIdVendedor(userDAO.getUsuario(rs.getInt("Id_Vendedor")));
        vendaRetornada.setDtVenda(rs.getDate("Data_Venda"));
        vendaRetornada.setTotalVenda(rs.getFloat("Total_Vendido"));
        if(populateItensVendidos){
            vendaRetornada.setItens(getItensVendidos(vendaRetornada));
        }
        return vendaRetornada;
    }

    public ItemVenda getItemVendido(int idItemVendido) throws SQLException {
        ResultSet rs = executeQuery("SELECT * FROM petshop.itens_venda WHERE Id = ?", idItemVendido);
        ItemVenda itemVendido = null;
       if (rs.next()) {
            itemVendido = populateItensVendidos(rs);
        }
        rs.close();
        return itemVendido;
    }
     public ItemVenda populateItensVendidos(ResultSet rs, Venda... venda) throws SQLException {
        ProdutoDAO prodDAO = new ProdutoDAO();
        ItemVenda itemRetornado = new ItemVenda();
        itemRetornado.setId(rs.getInt("Id"));
        itemRetornado.setQtde(rs.getInt("QTDE"));
        itemRetornado.setIdProduto(prodDAO.getProduto(rs.getInt("Id_Produto")));
        if(venda != null && venda.length > 0){
            itemRetornado.setIdVenda((venda[0]));
        }else{
           itemRetornado.setIdVenda(getVenda(rs.getInt("Id_Venda")));
        }
        return itemRetornado;
    }

    public List<ItemVenda> getItensVendidos(Venda idItensVendidos) throws SQLException {
        List<ItemVenda> itensRetornados = new LinkedList<ItemVenda>();
        ResultSet rs = executeQuery("SELECT * FROM petshop.itens_venda WHERE Id = ?", idItensVendidos.getId());
        while(rs.next()){
            itensRetornados.add(populateItensVendidos(rs, idItensVendidos));
        }
        rs.close();
        return itensRetornados;
    }

   
}
